python基础第二十节
本章节主要学习python的日志记录, 模块, 包.
20.1 日志记录
日志记录是一种重要的应用程序开发和维护技术, 它用于记录应用程序运行时的关键信息和事件.通过适当的日志记录, 我们可以追踪应用程序的行为、排查问题和监控系统状态.Python 提供了内置的 logging 模块, 使得日志记录变得简单而强大, 日志记录是将应用程序运行时的关键信息写入日志文件或输出到控制台.它有以下主要目的和优势:
- 问题排查:当应用程序出现错误或异常时, 日志记录提供了有关问题的关键信息, 有助于快速定位和修复错误.
- 系统监控:通过记录应用程序的运行状态、资源使用情况和性能指标, 日志记录可以帮助我们监控系统的健康状况.
- 运行分析:日志记录允许我们跟踪应用程序的执行流程和事件, 以便进行性能分析、行为分析和用户行为分析.
20.2 python的日志记录模块
Python 提供了内置的 logging 模块, 它是一个强大而灵活的日志记录工具.要使用 logging 模块, 先导入, 然后创建日志记录器
import logging
logger = logging.getLogger('my_logger')
设置日志级别
日志级别决定了哪些日志消息会被记录下来.logging 模块定义了以下几个日志级别(从低到高):
- DEBUG: 详细的调试信息, 适用于开发环境.
- INFO: 普通的信息消息, 用于确认应用程序的正常运行.
- WARNING: 警告消息, 表示潜在的问题或不合适的使用.
- ERROR: 错误消息, 表示应用程序遇到可恢复的错误.
- CRITICAL: 严重错误消息, 表示应用程序遇到无法恢复的错误.
可以设置日志记录器的级别, 以决定哪些级别的日志消息会被记录.默认情况下, 日志记录器的级别是WARNING, 这意味着只有WARNING、ERROR和CRITICAL级别的消息会被记录.
logger.setLevel(logging.DEBUG)
创建日志处理程序并配置输出格式
日志处理程序是 logging 模块用于处理和输出日志消息的组件.我们可以为日志记录器添加一个或多个处理程序, 以决定日志消息的输出位置.
# 输出到控制台.
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
handler.setFormatter(formatter)
将处理程序添加到日志记录器.
logger.addHandler(handler)
将日志写入到文件
要将日志写入到文件只需要将创建日志处理程序的StreamHandler更换为FileHandler
file_handler = logging.FileHandler('my_logger.log')
20.3 logging的另外一种使用方式
logging.basicConfig(
level=logging.DEBUG,
format='[%(name)s] %(asctime)s [%(levelname)s] %(message)s',
)
logger = logging.getLogger('my_name')
20.4 python模块
在 Python 中, 模块是一个包含函数、变量和类等代码定义的py文件.模块可以被其他程序或模块导入, 并使用其中的代码.一个模块可以包含多个函数、变量和类, 它们可以被其他程序重复使用, 提供了代码的可重用性和组织性.
使用模块的主要优势之一是代码的可重用性.通过将相关的代码组织在模块中, 可以在不同的程序或项目中重复使用, 减少代码重复编写的工作量, 并提高代码的可维护性和可扩展性.
Python 提供了许多内置的模块, 这些模块包含了丰富的功能和工具, 可以直接在代码中使用.例如, math 模块提供了数学运算函数, datetime 模块提供了日期和时间操作函数, random模块提供了生成随机数等操作.
此外, 还有许多第三方模块可供使用.第三方模块是由独立的开发者或组织创建和维护的模块, 可以通过包管理工具如 pip 安装和导入到项目中, 提供了各种功能和扩展, 满足不同的需求.
导入模块
import math
导入后, 可以通过 module_name 来访问模块中的函数、变量或类.例如, 使用 math 模块中的 sqrt 函数:
result = math.sqrt(16)
**或者可以使用from-import来导入.可以选择性地导入模块中的特定函数、变量或类, 而不是导入整个模块. **
from math import sqrt
# 或者可以一次性导入多个.
from math import sqrt, ceil
as可以为导入的模块或对象指定一个别名, 以便在代码中更方便地引用.
import math as m
result = m.sqrt(16)
导入全部, 不推荐使用
from math import *
# 可以导入math中全部的.
__all__的作用
__all__ 变量主要适用于在使用 from module_name import * 语句时, 控制模块中哪些标识符可以被导入.
当一个模块中定义了 __all__ 变量时, 只有在 __all__ 列表中列出的标识符才会被导入.其他未在 __all__ 中列出的标识符将不会被导入.
这种机制可以用来控制通过 from module_name import * 导入的内容, 以避免意外地导入大量的标识符, 可能导致命名冲突或混乱的情况.
20.5 __name__ == '__main__'
用于确定当前模块是否作为主程序执行, 或者只是被导入到其他模块中使用.
具体含义如下:
- 当一个 Python 文件被直接执行时, 即作为主程序执行时,
__name__的值将被设置为'__main__', 表示当前模块是主程序. - 当一个 Python 文件被导入到其他模块中时,
__name__的值将是模块的名称, 而不是'__main__'.
因此, 通过使用if __name__ == '__main__'条件判断, 可以实现以下效果: - 当模块作为主程序执行时, 执行
if语句块中的代码. - 当模块被导入到其他模块中时,
if语句块中的代码将不会执行.
这种用法常用于在模块中定义一些测试代码, 以确保只有当模块作为主程序执行时才运行这些测试代码, 而在被导入时不执行.这样可以使模块在作为独立程序和作为库时具有不同的行为.
20.6 python包
实际开发中, 一个大型的项目往往需要使用到很多的Python模块, 如果将这些模块都堆放在一起, 势必不好管理.而且, 使用模块可以有效避免变量名或函数名重名引发的冲突, 但是如果模块名重复怎么办呢?因此, Python提出了包(Package)的概念.
python的包就是一个文件夹, 只是在该文件里包含了一个__init__.py文件. 这个包里可以存放很多python的模块, 通过包, 在逻辑上将一批模块归为一类, 方便管理和使用.__init__.py文件用来标识此文件夹是一个python包.